gtkpopover: Set GTK grab on autohide popovers
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 20 Apr 2020 17:48:10 +0000 (19:48 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 20 Apr 2020 18:28:05 +0000 (20:28 +0200)
These popovers handle clicks outside the widget, and expect input
to be routed through it when it is shown. This pretty much matches
the characteristics of GTK grabs, and setting one up will ensure
the cancellation of event controllers that were active at the time
of showing the popover.

Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/2446
gtk/gtkpopover.c

index ad0ec0f86285715a980e4cb1fef8a9e552e40558..a2a6adf6547e45162ee548491039828e628b44a9 100644 (file)
@@ -920,12 +920,20 @@ gtk_popover_show (GtkWidget *widget)
     {
       if (!gtk_widget_get_focus_child (widget))
         gtk_widget_child_focus (widget, GTK_DIR_TAB_FORWARD);
+
+      gtk_grab_add (widget);
     }
 }
 
 static void
 gtk_popover_hide (GtkWidget *widget)
 {
+  GtkPopover *popover = GTK_POPOVER (widget);
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  if (priv->autohide)
+    gtk_grab_remove (widget);
+
   gtk_popover_set_mnemonics_visible (GTK_POPOVER (widget), FALSE);
   _gtk_widget_set_visible_flag (widget, FALSE);
   gtk_widget_unmap (widget);